package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ISalaryBillSendDAO;
import org.jsola.hr.dto.SalaryBillSendAddDTO;
import org.jsola.hr.dto.SalaryBillSendUpdateDTO;
import org.jsola.hr.entity.SalaryBillSendDO;
import org.jsola.hr.query.SalaryBillSendQuery;
import org.jsola.hr.query.SalaryBillSendRelQuery;
import org.jsola.hr.vo.SalaryBillListVO;
import org.jsola.hr.vo.SalaryBillSendListVO;
import org.jsola.hr.vo.SalaryBillSendVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 工资条发放信息
 *
 * @author zhr
 */
public interface ISalaryBillSendService extends IService<ISalaryBillSendDAO, SalaryBillSendDO> {

    /**
     * 新增工资条发放信息
     * @param salaryBillSendAddDTO 新增工资条发放信息DTO
     * @param tokenUser 当前用户
     * @return 工资条发放信息详情信息
     */
    SalaryBillSendVO save(SalaryBillSendAddDTO salaryBillSendAddDTO, TokenUser tokenUser);

    /**
     * 修改工资条发放信息
     * @param salaryBillSendUpdateDTO 修改工资条发放信息DTO
     * @param tokenUser 当前用户
     * @return 更新数量
     */
    int update(SalaryBillSendUpdateDTO salaryBillSendUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除工资条发放信息，物理删除，更新is_valid字段，从回收站删除
     * @param tokenUser 当前用户
     * @param salaryBillSendIds 工资条发放信息id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String...salaryBillSendIds);

    /**
     * 根据工资条发放信息id查找
     * @param salaryBillSendId 工资条发放信息id
     * @param siteId 所属站点id
     * @return 工资条发放信息详情信息
     */
    SalaryBillSendVO selectById(String salaryBillSendId, String siteId);

    /**
     * 查询工资条发放信息
     * @param salaryBillSendQuery 查询条件
     * @param siteId 所属站点id
     * @return 工资条发放信息列表信息
     */
    List<SalaryBillSendListVO> select(SalaryBillSendQuery salaryBillSendQuery, String siteId);

    /**
    * 查询工资条发放信息记录数
    * @param salaryBillSendQuery 查询条件
    * @param siteId 所属站点id
    * @return 工资条发放信息记录数
    */
    int selectCount(SalaryBillSendQuery salaryBillSendQuery, String siteId);

    /**
     * 分页查询工资条发放信息
     * @param salaryBillSendQuery 查询条件
     * @param siteId 所属站点id
     * @return 工资条发放信息列表信息
     */
    Page<SalaryBillSendListVO> selectPage(SalaryBillSendQuery salaryBillSendQuery, String siteId);


    /**
     * 根据工资条发放信息id查找
     * @param salaryBillSendId 工资条发放信息id
     * @param siteId 所属站点id
     * @return 工资条发放信息
     */
    SalaryBillSendDO selectDOById(String salaryBillSendId, String siteId);

    /**
     * 查询工资条发放信息
     * @param salaryBillSendQuery 查询条件
     * @param siteId 所属站点id
     * @return 工资条发放信息列表
     */
    List<SalaryBillSendDO> selectDO(SalaryBillSendQuery salaryBillSendQuery, String siteId);

    /**
     * 查询工资条发放详情tab
     * @param salaryBillSendQuery 查询条件
     * @param siteId 所属站点id
     * @return 工资条发放信息VO
     */
    SalaryBillSendVO salaryBillSendDetailTab(SalaryBillSendQuery salaryBillSendQuery, String siteId);

    /**
     * 分页查询工资条发放记录
     * @param salaryBillSendQuery 查询条件
     * @param siteId 所属站点id
     * @return 工资条发放记录分页
     */
    Page<SalaryBillSendListVO> salaryBillSendListPage(SalaryBillSendQuery salaryBillSendQuery, String siteId);

    /**
     * 根据发放信息查询工资条分页
     * @param salaryBillSendRelQuery 查询条件
     * @param siteId 所属站点id
     * @return 工资条记录分页
     */
    Page<SalaryBillListVO> salaryBillListPageBySend(SalaryBillSendRelQuery salaryBillSendRelQuery, String siteId);

    /**
     * 工资表撤回工资条
     * @param salaryBillSendUpdateDTO 工资条发放修改对象
     * @param tokenUser 登录用户
     * @return 撤回条数
     */
    Integer withdraw(SalaryBillSendUpdateDTO salaryBillSendUpdateDTO, TokenUser tokenUser);

    /**
     * 根据发放信息查询工资条分页详情
     * @param salaryBillSendRelQuery 查询条件
     * @param siteId 所属站点id
     * @return 工资条记录分页
     */
    Page<SalaryBillListVO> salaryBillPageBySendDetail(SalaryBillSendRelQuery salaryBillSendRelQuery, String siteId);

    /**
     * 根据发放信息查询工资条所有详情
     * @param salaryBillSendRelQuery 查询条件
     * @param siteId 所属站点id
     * @return 工资条记录分页
     */
    List<SalaryBillListVO> allSalaryBillSendDetail(SalaryBillSendRelQuery salaryBillSendRelQuery, String siteId);

    /**
     * 工资条到期自动确认
     * @param subjectId 业务ID即发放记录ID
     * @param tokenUser 登录用户
     * @return 执行成功条数
     */
    Integer updateSalaryBillStatus(String subjectId, TokenUser tokenUser);
}


